/**
 * Created by PanJiaChen on 16/11/18.
 */

/**
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path) {
  return /^(https?:|mailto:|tel:)/.test(path)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUsername(str) {
  return true
}

/**
 * @param {string} url
 * @returns {Boolean}
 */
export function validURL(url) {
  const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return reg.test(url)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validLowerCase(str) {
  const reg = /^[a-z]+$/
  return reg.test(str)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUpperCase(str) {
  const reg = /^[A-Z]+$/
  return reg.test(str)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validAlphabets(str) {
  const reg = /^[A-Za-z]+$/
  return reg.test(str)
}

/**
 * @param {string} email
 * @returns {Boolean}
 */
export function validEmail(email) {
  const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  return reg.test(email)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function isString(str) {
  if (typeof str === 'string' || str instanceof String) {
    return true
  }
  return false
}

/**
 * @param {Array} arg
 * @returns {Boolean}
 */
export function isArray(arg) {
  if (typeof Array.isArray === 'undefined') {
    return Object.prototype.toString.call(arg) === '[object Array]'
  }
  return Array.isArray(arg)
}

export function validateSocialCreditCode(rule,Code,callback) {//验证社会统一信用代码
  let patrn = /^[0-9A-Z]+$/;
  if ((Code.length !== 18) || (patrn.test(Code) === false)) {
    return callback(new Error('统一社会信用代码为18位数字和大写字母组成'));
  } else {
    let Ancode;//统一社会信用代码的每一个值
    let Ancodevalue;//统一社会信用代码每一个值的权重
    let total = 0;
    let weightedfactors = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];//加权因子
    let str = '0123456789ABCDEFGHJKLMNPQRTUWXY';
    //不用I、O、S、V、Z
    for (let i = 0; i < Code.length - 1; i++) {
      Ancode = Code.substring(i, i + 1);
      Ancodevalue = str.indexOf(Ancode);
      total = total + Ancodevalue * weightedfactors[i];
      //权重与加权因子相乘之和
    }
    let logiccheckcode = 31 - total % 31;
    if (logiccheckcode === 31) {
      logiccheckcode = 0;
    }
    let Str = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,W,X,Y";
    let Array_Str = Str.split(',');
    logiccheckcode = Array_Str[logiccheckcode];
    let checkcode = Code.substring(17, 18);
    if (logiccheckcode !== checkcode) {
      return callback(new Error('不是有效的统一社会信用代码'));
    }
    return callback();
  }
}

export function validateSocialCreditCode2(rule,Code,callback) {//验证社会统一信用代码
  let patrn = /^[0-9A-Z]+$/;
  if (Code) {
    if ((Code.length !== 18) || (patrn.test(Code) === false)) {
      return callback(new Error('统一社会信用代码为18位数字和大写字母组成'));
    } else {
      let Ancode;//统一社会信用代码的每一个值
      let Ancodevalue;//统一社会信用代码每一个值的权重
      let total = 0;
      let weightedfactors = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];//加权因子
      let str = '0123456789ABCDEFGHJKLMNPQRTUWXY';
      //不用I、O、S、V、Z
      for (let i = 0; i < Code.length - 1; i++) {
        Ancode = Code.substring(i, i + 1);
        Ancodevalue = str.indexOf(Ancode);
        total = total + Ancodevalue * weightedfactors[i];
        //权重与加权因子相乘之和
      }
      let logiccheckcode = 31 - total % 31;
      if (logiccheckcode === 31) {
        logiccheckcode = 0;
      }
      let Str = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,W,X,Y";
      let Array_Str = Str.split(',');
      logiccheckcode = Array_Str[logiccheckcode];
      let checkcode = Code.substring(17, 18);
      if (logiccheckcode !== checkcode) {
        return callback(new Error('不是有效的统一社会信用代码'));
      }
      return callback();
    }
  } else {
    return callback();
  }
}

export function validateIdCard (rule, idcode, callback) {//验证身份证号码
  if((idcode !== undefined) && (idcode !== '') && (idcode !== null)){
    if(typeof idcode !== 'string'){
      return callback(new Error('非法字符'));
    }else if ((idcode.length === 18) || (idcode.length === 15)) {
      let city = {11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江 ",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北 ",43:"湖南",44:"广东",
        45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏 ",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"};
      if(city[idcode.substr(0,2)] === undefined) {
        return callback(new Error('前两位为非法地区'));
      };
      let ereg = '';
      if(idcode.length === 15){
        if ((parseInt(idcode.substr(6, 2)) + 1900) % 4 === 0 || ((parseInt(idcode.substr(6, 2)) + 1900) % 100 === 0 && (parseInt(idcode.substr(6, 2)) + 1900) % 4 === 0)) {
          ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/; //测试出生日期的合法性
        } else {
          ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/; //测试出生日期的合法性
        }
        if (ereg.test(idcode)) {
          return callback(new Error('身份证格式不正确'));
        }
      }else{
        let Y, JYM;
        let S, M;
        let idcard_array = new Array();
        idcard_array = idcode.split("");
        if (parseInt(idcode.substr(6, 4)) % 4 === 0 || (parseInt(idcode.substr(6, 4)) % 100 === 0 && parseInt(idcode.substr(6, 4)) % 4 === 0)) {
          ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9XxAa]$/; //闰年出生日期的合法性正则表达式
        } else {
          ereg = /^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9XxAa]$/; //平年出生日期的合法性正则表达式
        }
        if (ereg.test(idcode)) {//测试出生日期的合法性
          //计算校验位
          S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7
            + (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9
            + (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10
            + (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5
            + (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8
            + (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4
            + (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2
            + parseInt(idcard_array[7]) * 1
            + parseInt(idcard_array[8]) * 6
            + parseInt(idcard_array[9]) * 3;
          Y = S % 11;
          M = "F";
          JYM = "10X98765432";
          M = JYM.substr(Y, 1);
          /*判断校验位*/
          if (M === idcard_array[17]) {  /*检测ID的校验位false;*/
            return callback();
          } else if (idcard_array[17] === 'A') {//A结尾不校验规则
            return callback();
            /*检测ID的校验位false;*/
          } else {
            return callback(new Error('身份证格式不正确'));
          }
        } else {
          return callback(new Error('身份证格式不正确'));
        }
      }
      return  callback();
    } else {
      return callback(new Error('身份证长度只能是15位或18位'));
    }
  }else{
    return callback();
  }
}


